package com.aspire.aimini.service;

import java.util.List;
import java.util.Map;

/**
 * 统计分析Service接口
 *
 * @author wangguiyou
 * @date 2024-01-01
 * @description 统计分析业务逻辑接口
 */
public interface StatisticsService {

    /**
     * 获取用户统计信息
     *
     * @param userId 用户ID
     * @return 用户统计信息
     */
    Map<String, Object> getUserStatistics(Long userId);

    /**
     * 获取系统统计信息
     *
     * @return 系统统计信息
     */
    Map<String, Object> getSystemStatistics();

    /**
     * 获取热门标签统计
     *
     * @param limit 限制数量
     * @return 热门标签列表
     */
    List<Map<String, Object>> getPopularTags(Integer limit);

    /**
     * 获取用户素材统计
     *
     * @param userId 用户ID
     * @return 素材统计信息
     */
    Map<String, Object> getUserMaterialStats(Long userId);

    /**
     * 获取用户文案统计
     *
     * @param userId 用户ID
     * @return 文案统计信息
     */
    Map<String, Object> getUserCopywritingStats(Long userId);

    /**
     * 获取用户AI使用统计
     *
     * @param userId 用户ID
     * @return AI使用统计信息
     */
    Map<String, Object> getUserAiUsageStats(Long userId);

    /**
     * 按文件类型统计素材数量
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countMaterialsByFileType(Long userId);

    /**
     * 按来源类型统计素材数量
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countMaterialsBySourceType(Long userId);

    /**
     * 按内容类型统计文案数量
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countCopywritingByContentType(Long userId);

    /**
     * 按风格统计文案数量
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countCopywritingByStyle(Long userId);

    /**
     * 按AI模型统计文案数量
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countCopywritingByAiModel(Long userId);

    /**
     * 按标签分类统计数量
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countTagsByCategory(Long userId);

    /**
     * 按生成类型统计AI使用次数
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countAiUsageByGenerationType(Long userId);

    /**
     * 按服务提供商统计AI使用次数
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countAiUsageByProvider(Long userId);

    /**
     * 统计用户每日素材上传数量
     *
     * @param userId 用户ID
     * @param days   天数
     * @return 统计结果
     */
    List<Map<String, Object>> countDailyMaterialUploads(Long userId, Integer days);

    /**
     * 统计用户每日文案生成数量
     *
     * @param userId 用户ID
     * @param days   天数
     * @return 统计结果
     */
    List<Map<String, Object>> countDailyCopywritingGeneration(Long userId, Integer days);

    /**
     * 统计用户每日AI使用数量
     *
     * @param userId 用户ID
     * @param days   天数
     * @return 统计结果
     */
    List<Map<String, Object>> countDailyAiUsage(Long userId, Integer days);

    /**
     * 统计用户每日AI消耗金额
     *
     * @param userId 用户ID
     * @param days   天数
     * @return 统计结果
     */
    List<Map<String, Object>> sumDailyAiCost(Long userId, Integer days);

    /**
     * 获取用户活跃度统计
     *
     * @param userId 用户ID
     * @param days   天数
     * @return 活跃度统计
     */
    Map<String, Object> getUserActivityStats(Long userId, Integer days);

    /**
     * 获取存储使用统计
     *
     * @param userId 用户ID
     * @return 存储使用统计
     */
    Map<String, Object> getStorageUsageStats(Long userId);

    /**
     * 获取系统性能统计
     *
     * @return 系统性能统计
     */
    Map<String, Object> getSystemPerformanceStats();

    /**
     * 获取用户排行榜
     *
     * @param type  排行类型(upload, generation, usage等)
     * @param limit 限制数量
     * @return 排行榜列表
     */
    List<Map<String, Object>> getUserRanking(String type, Integer limit);

    /**
     * 获取热门素材统计
     *
     * @param limit 限制数量
     * @return 热门素材列表
     */
    List<Map<String, Object>> getPopularMaterials(Integer limit);

    /**
     * 获取热门文案统计
     *
     * @param limit 限制数量
     * @return 热门文案列表
     */
    List<Map<String, Object>> getPopularCopywriting(Integer limit);

    /**
     * 获取AI服务使用统计
     *
     * @return AI服务使用统计
     */
    Map<String, Object> getAiServiceUsageStats();

    /**
     * 获取错误统计信息
     *
     * @param days 天数
     * @return 错误统计信息
     */
    Map<String, Object> getErrorStats(Integer days);

    /**
     * 获取用户增长统计
     *
     * @param days 天数
     * @return 用户增长统计
     */
    List<Map<String, Object>> getUserGrowthStats(Integer days);

    /**
     * 获取收入统计
     *
     * @param days 天数
     * @return 收入统计
     */
    List<Map<String, Object>> getRevenueStats(Integer days);

    /**
     * 生成统计报告
     *
     * @param userId     用户ID
     * @param reportType 报告类型
     * @param startDate  开始日期
     * @param endDate    结束日期
     * @return 报告数据
     */
    Map<String, Object> generateStatisticsReport(Long userId, String reportType, String startDate, String endDate);

    /**
     * 导出统计数据
     *
     * @param userId    用户ID
     * @param dataType  数据类型
     * @param format    导出格式
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 导出文件路径
     */
    String exportStatisticsData(Long userId, String dataType, String format, String startDate, String endDate);

    /**
     * 获取实时统计数据
     *
     * @param userId 用户ID
     * @return 实时统计数据
     */
    Map<String, Object> getRealTimeStats(Long userId);

    /**
     * 刷新统计缓存
     *
     * @param userId    用户ID
     * @param statsType 统计类型
     */
    void refreshStatsCache(Long userId, String statsType);
}